package com.ilongsay.service.impl;

import com.ilongsay.dao.BillSqliteDao;
import com.ilongsay.dao.BillSqliteDetailDao;
import com.ilongsay.dao.SettingDao;
import com.ilongsay.entity.*;
import com.ilongsay.service.IConfirmSixService;
import com.ilongsay.utils.CalcUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author ilongsay
 * @Email ilongsay@163.com
 * @Copyright 版本所有，侵权必究！
 * @Datetime 2018-12-30 15:53
 * @Describution 和6分钱误差相关的服务，为日后的拆分做准备
 */
@Service("confirmService")
public class ConfirmServiceImpl implements IConfirmSixService {

    @Autowired
    private BillSqliteDao billSqliteDao;

    @Autowired
    private BillSqliteDetailDao billSqliteDetailDao;

    @Autowired
    private SettingDao settingDao;

    private static final String MSG_OK = "误差调整成功，请检查金额是否一致！";
    /**
     * @param faPiaos
     * @return java.util.List<com.ilongsay.entity.FaPiao>
     * 确定是否有误差
     * XXX:需要改动，这里是为了防止多税率的情况下设置的数据
     */
    @Override
    public AjaxObject confirmSixError(List<FaPiao> faPiaos) {
        AjaxObject ajaxObject = new AjaxObject();
        for (FaPiao faPiao : faPiaos) {
            //判断是否有没有校验的数据
            if(faPiao.getIsSix().equals("0")){
                //得到当前发票的所有的明细
                List<FaPiaoDetail> billCodes = null;
                try{
                    billCodes = faPiao.getFaPiaoDetails();
                }catch( Exception e ){
                    ajaxObject.setCode("1");
                    e.printStackTrace();
                    ajaxObject.setMsg("查询单据失败！校验误差失败！"+e.toString());
                    return ajaxObject;
                }

                //总金额
                String total = "0";

                //税额,暂时不计算出来
                String taxAmount = "0";

                //计算的税额
                String taxAmount2 = "0";
                //迭代每一条明细
                for (FaPiaoDetail billCode : billCodes) {
                    String taxAmount1= "0";
                    total = CalcUtils.add(
                            CalcUtils.sround(billCode.getTotal(),2), total);
                    taxAmount = CalcUtils.add(billCode.getTaxAmount(), taxAmount);
                    //判断是否含税，1为含税
                    if (billCode.getTaxFlag().equals("1")) {
                        //总金额÷（1+税率）*税率 不用保留2位小数，直接总的保留
                        taxAmount1 = CalcUtils.mul(
                                     CalcUtils.div(billCode.getTotal(),
                                     CalcUtils.add("1",billCode.getTaxRate()),10),billCode.getTaxRate());
                    }else {
                        //如果金额是未税金额，那么税额的计算方式是 未税金额*税率
                        taxAmount1 = CalcUtils.mul(billCode.getUntotal(),billCode.getTaxRate());
                    }
                    taxAmount2 = CalcUtils.add(taxAmount1,taxAmount2);
                }

                //TODO:税额2位小数插入到数据库中需要实现（拆分的逻辑里面实现）
                //原始税额（一般从数据库取出来的数是2位小数）和计算后的税额(保留2位小数)进行比较,看下是否大于0.06
                if (Math.abs(CalcUtils.sub(taxAmount, CalcUtils.round(taxAmount2,2))) > 0.06) {
                    faPiao.setIsSix("1");//为1的时候设置为有6分钱误差

                    //TODO：6分钱误差调整的时候也需要进行更新数据库的值，提示客户有误差
                    billSqliteDao.updateIsSix(faPiao.getBillCode(),"1");//更新数据库
                }

            }
        }
        ajaxObject.setCode("0");//执行成功
        ajaxObject.setMsg("");
        return ajaxObject;
    }

    /**
     * @param faPiaos
     * @return com.ilongsay.entity.AjaxObject
     * 判断是否超出限额
     */
    @Override
    public AjaxObject confirmRather(List<FaPiao> faPiaos) {
        AjaxObject ajaxObject = new AjaxObject();

        for (FaPiao faPiao : faPiaos) {
            LimitType type = settingDao.queryLimitSetting(faPiao.getBillType());
            String l = type.getLimit();//得到限额
            String limit = CalcUtils.sub(l, "0.01");//一般真实的限额会小0.01分

            //判断是否超过限额
            if (Double.valueOf(CalcUtils.sub(faPiao.getUntotal(), limit)) > 0) {
                faPiao.setIsRather("1");
                billSqliteDao.updateIsRather(faPiao.getBillCode(),"1");
            }
        }
        ajaxObject.setCode("0");
        return ajaxObject;
    }

    /**
     * @param billCode 传进来的订单集合
     * @return com.ilongsay.entity.AjaxObject
     * 系统自动调整误差服务
     */
    @Override
    public AjaxObject autoAdjustSixError(String billCode) {
        return null;
    }

    /**
     * @param errorAdjust 误差调整参数
     * @return com.ilongsay.entity.AjaxObject
     * 客户手动进行误差调整的服务
     */
    @Override
    public AjaxObject handAdjustError(ErrorAdjust errorAdjust) {
        return null;
    }

}
